package rbm.modelado.estados;

import java.util.Set;
import java.util.SortedSet;

import rbm.modelado.soluciones.SolucionRBM;
import rbm.modelado.soluciones.SolucionMochilaImpl;

import modelado.datos.elementos.Elemento;
import modelado.datos.elementos.ObjetoMochila;
import modelado.estados.EstadoAbstracto;
import modelado.soluciones.Solucion;
import modelado.soluciones.Soluciones;
import utiles.FactoriaDeColecciones;
import utiles.Metricas;

public class EstadoLaberintoImpl extends EstadoAbstracto implements EstadoMochila {
	private Integer peso;
	private Integer valor;
	private Integer capacidadRestante;
	private Soluciones soluciones;
	private Metricas metricas;

	/**
	 * Constructor
	 * 
	 * @param el
	 *            : seran los elementos activos
	 * @param c
	 *            : capacidad
	 */
	public EstadoLaberintoImpl(SortedSet<Elemento> el, Integer c) {
		super(el);
		peso = 0;
		capacidadRestante = c;
		valor = 0;

	}

	public Soluciones getSoluciones() {
		return soluciones;
	}

	public void setSoluciones(Soluciones s) {
		soluciones = s;
	}

	public void setMetricas(Metricas m) {
		metricas = m;
	}

	public Metricas getMetricas() {
		return metricas;
	}

	/**
	 * Al incluir un elemento, hay que actualizar el peso, el valor y la
	 * capacidad restante
	 */
	// TODO 
	public void addElemento(Elemento e) {
		super.addElemento(e);
		ObjetoMochila om = (ObjetoMochila) e;
		valor += om.getNumInstancias()*om.getValor();
		peso += om.getNumInstancias()*om.getPeso();
		capacidadRestante -= om.getNumInstancias()*om.getPeso();
	}

	/**
	 * Al eliminar un elemento, hay que actualizar el peso, el valor y la
	 * capacidad restante
	 */
	// TODO 
	public Elemento remove() {
		Elemento e = super.remove();
		ObjetoMochila om = (ObjetoMochila) e;
		valor -= om.getNumInstancias()*om.getValor();
		peso -= om.getNumInstancias()*om.getPeso();
		capacidadRestante += om.getNumInstancias()*om.getPeso();
		return e;
	}

	public Integer getPeso() {
		return peso;
	}

	public Integer getValor() {
		return valor;
	}

	public Integer getCapacidadRestante() {
		return capacidadRestante;
	}

	public String toString() {
		String a = super.toString() + ", Peso= " + peso + ",  Valor= " + valor
				+ " Capacidad Restante= " + capacidadRestante;
		return a;
	}

	public Set<Elemento> getConjunto() {
		Set<Elemento> conjunto = FactoriaDeColecciones.creaSet();
		for (Elemento e : getLista()) {
			conjunto.add(e);
		}
		return conjunto;
	}

	public Solucion clone() {
		SolucionRBM s = new SolucionMochilaImpl();
		Elemento ec;
		for (Elemento e : getLista()) {
			ec = e.clone();
			s.addElemento(ec);
		}
		return s;
	}
}
